package domain;

import java.util.Date;
import java.util.Observable;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * @author Andy
 *
 */
@Entity
public class MellemVare extends Observable {

	@Id
	private int vareNr;
	private int nuvaerendeDelBehandlingsId;
	private int delbehandlingsID;
	private String type;
	private Boolean faerdigBehandlet;
	private Tilstand tilstand;
	private Behandling behandling;
	private Lagerplads lagerplads;
	private int behandlingsTid;
	private int antalEnheder;
	@Temporal (TemporalType.DATE)
	private Date foraeldetDato = null;


	public MellemVare(int vareNr, String type, Behandling behandling, Tilstand tilstand, int antalEnheder){
		this.vareNr = vareNr;
		this.type = type;
		this.tilstand = tilstand;
		this.antalEnheder = antalEnheder;
		nuvaerendeDelBehandlingsId = 0;
		delbehandlingsID = behandling.getAllDelBehandlinger().get(nuvaerendeDelBehandlingsId).getId();
		faerdigBehandlet = false;
		setBehandling(behandling);
		setBehandlingsTid();
	}
	public MellemVare(){
	}

	/*
	 * TRIVIAL CODE BELOW
	 */

	public void setBehandlingsTid(){
		if(this.tilstand == Tilstand.TOERRING){
			behandlingsTid = behandling.getAllDelBehandlinger().get(nuvaerendeDelBehandlingsId).getOptimalToerretid();
		}else{
			behandlingsTid = 0;

		}
	}

	public void changeAndNotify(){
		setChanged();
		notifyObservers();
	}

	public int getVareNr() {
		return vareNr;
	}

	public void setVareNr(int vareNr) {
		this.vareNr = vareNr;
	}

	public int getNuvaerendeDelBehandlingsId() {
		return nuvaerendeDelBehandlingsId;
	}

	public void setNuvaerendeDelBehandlingsId(int nuvaerendeDelBehandlingsId) {
		this.nuvaerendeDelBehandlingsId = nuvaerendeDelBehandlingsId;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public Boolean isFaerdigBehandlet() {
		return faerdigBehandlet;
	}

	public void setFaerdigBehandlet(Boolean faerdigBehandlet) {
		this.faerdigBehandlet = faerdigBehandlet;
	}

	public Tilstand getTilstand() {
		return tilstand;
	}

	public void setTilstand(Tilstand tilstand) {
		this.tilstand = tilstand;
	}

	public Behandling getBehandling() {
		return behandling;
	}

	public void setBehandling(Behandling behandling) {
		if(behandling != null){
			setBehandlingUD(behandling);
			behandling.addMellemVareUD(this);
		} else {
			this.getBehandling().removeMellemVare(this);
			this.setBehandlingUD(null);
		}
	}

	public void setBehandlingUD(Behandling behandling){
		this.behandling = behandling;
	}

	public Lagerplads getLagerplads() {
		return lagerplads;
	}

	public void setLagerpladsUD(Lagerplads lagerplads) {
		this.lagerplads = lagerplads;
	}

	public void setLagerplads(Lagerplads lagerplads){
		if(lagerplads != null){
			setLagerpladsUD(lagerplads);
			lagerplads.setMellemVareUD(this);
		} else {
			this.getLagerplads().setMellemVareUD(null);
			this.setLagerpladsUD(null);
		}
	}

	public int getBehandlingsTid(){
		return behandlingsTid;
	}


	public String toString(){
		return "" + vareNr;
	}

	public int getAntalEnheder() {
		return antalEnheder;
	}

	public void setAntalEnheder(int antalEnheder) {
		this.antalEnheder = antalEnheder;
	}

	public Date getForaeldetDato() {
		return foraeldetDato;
	}

	public void setForaeldetDato(Date foraeldetDato) {
		this.foraeldetDato = foraeldetDato;
	}

	/*
	 * NON TRIVIAL CODE BELOW
	 */

	//@Author: Thomas Teilmann

	public void naesteDelBehandling(){
		nuvaerendeDelBehandlingsId++;
		if(nuvaerendeDelBehandlingsId >= behandling.getAllDelBehandlinger().size()-1){
			faerdigBehandlet=true;
			changeAndNotify();
		}
		setBehandlingsTid();
	}

	//@Author: Andy Vidkjaer

	public void beregnBehandlingsTid(int min){
		if(behandling != null){
			if(tilstand == Tilstand.TOERRING && behandlingsTid > 0 && tilstand != Tilstand.FORAELDET){
				behandlingsTid = behandlingsTid - min;
				if(nuvaerendeDelBehandlingsId == behandling.getAllDelBehandlinger().size()-1){
					tilstand = Tilstand.FAERDIG;
					changeAndNotify();
				}


			}
			if(tilstand == Tilstand.TOERRING && behandlingsTid == 0){
				tilstand = Tilstand.OVERSKRAEDET;
				changeAndNotify();
			}
			if(tilstand == Tilstand.FAERDIG || tilstand == Tilstand.OVERSKRAEDET){
				behandlingsTid = behandlingsTid + min;
				if(behandlingsTid == behandling.getAllDelBehandlinger().get(nuvaerendeDelBehandlingsId).getMaxToerretid()){
					tilstand = Tilstand.FORAELDET;
					foraeldetDato = new Date();
					this.setBehandling(null);
					changeAndNotify();
				}
			}

		}
	}









}
